#include "mprpcconfig.h"
#include "logger.h"

#include <cstring>

// 加载配置文件
void MprpcConfig::LoadConfigFile(const char *config_file)
{
    FILE *pf = fopen(config_file, "r");
    if (nullptr == pf)
    {
        std::cout << config_file << "is not exist!" << std::endl;
        LOG_FATAL("%s is not exist!", config_file);
        exit(2);
    }

    // 1. 注释
    // 2. 正确的配置选项
    // 3. 去掉前面和后面多余的空格
    while (!feof(pf))
    {
        char buf[512];
        fgets(buf, sizeof buf, pf);
        // buf[strlen(buf) - 1] = '\0';

        std::string line(buf);
        int idx = line.find('\n');
        if (std::string::npos != idx)
            line.erase(idx, 1);

        Trim(line);

        // 去掉注释
        if (line.empty() || line[0] == '#')
        {
            continue;
        }

        // 解析配置项
        idx = line.find('=');
        if (std::string::npos == idx)
        {
            // std::cout << "\r\n\t 配置项不合法! \r\n\n";
            LOG_ERR("\r\n\t 配置项不合法! \r\n\n");
            continue;
        }

        std::string key = line.substr(0, idx);
        Trim(key);
        std::string value = line.substr(idx + 1);
        Trim(value);
        m_configMap.insert({key, value});
    }
}

// 查询配置选项
std::string MprpcConfig::GetValue(const std::string &key)
{
    auto it = m_configMap.find(key);
    if (it == m_configMap.end())
        return "";
    return it->second;
}

// 去掉字符串前后多余的空格
void MprpcConfig::Trim(std::string &buf)
{
    int idx = buf.find_first_not_of(' ');
    if (std::string::npos != idx)
    {
        // 说明存在前导空格
        buf = buf.substr(idx);
    }

    // 去掉后面多余的空格
    idx = buf.find_last_not_of(' ');
    if (std::string::npos != idx)
    {
        // 说明字符串后面存在多余空格
        buf = buf.substr(0, idx + 1);
    }
}
